package rejahealth.util;

import java.io.*;
import java.net.*;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import rejahealth.model.Person;

public class EnergySensor {

    private static final int serverPort = 8763;
    public static Person _person = new Person();
    public static String serverIP = "192.168.49.38";
    
    public Person getPerson() {
        return _person; 
    }

    public Person getDados() 
    {
        Person person = new Person();  
        
        String umidade = null;
        String temperatura = null;
        String idade = null;
        String altura = null;
        String peso = null;
        String sexo = null;
        String gordura = null;
        String hidratacao = null;
        String message = "";
        
        Sql bd = new Sql();
        Sql.conectarBanco();
        int ok = 0;
        
        //Comentar as 2 linhas abaixo para ignorar proceso random person
        //RandomPersonTemp randomPerson = new RandomPersonTemp();
        //_person = randomPerson.getTempPerson();
        
        /*o IP da arduino. Este dado é obtido pelo código de arduino.
         *
         * Rotina que recebe os dados caso o ip tenha sido colocado
         */
        
        System.out.println("Energy");
        if(serverIP != null)
        {
            message = null;
            
            try 
            {
                do{
                
                
                    Socket clientSocket = new Socket(serverIP, serverPort);// cria um socket para comunicação
                    //entre servidor e cliente. Utiliza uma porta e o IP do servidor como argumento do
                    //construtor
                    // Caso a conexão funcione, imprime o ip e a porta da conexão.
                    System.out.println("\nConnected to:"+serverIP+" on port:"+serverPort);
                    /*
                     * Prepara para receber e enviar dados.
                     */
                    DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
                    DataInputStream in = new DataInputStream (clientSocket.getInputStream());
                    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                    //Envia mensagem
                    String msgToServer = "Aplicacao Rede de Sensores JAVADB conectada\n";//Message tha will be sent
                    out.writeChars(msgToServer);//sending the message
                    System.out.println("\nsending to Arduino-Server: "+msgToServer);//debug
                    /*
                     * Lê as mensagens enviadas pela arduino (servidor). Caso sejam os dados dos sensores
                     * e eles nao forem iguais a zero, ou seja, caso o botão 1 tenha sido acionado,
                     * imprime e envia os dados para o banco de dados.
                     * Se os dados forem 0, eles são ignorados.
                     * Se o botão 2 tiver sido acionado, encerra a conexão. com o servidor
                     */
                    do
                    {
                        message = null;
                        message = inFromServer.readLine();
                        if((message.equals("usuario reconhecido"))==false);
                        {
                            
                            if (message.equals("Umidade"))
                            {
                                umidade = inFromServer.readLine();
                                System.out.println("TESTE UMID: ");
                                System.out.println(umidade);
                            }if (message.equals("Temperatura"))
                            {
                                temperatura = inFromServer.readLine();
                                System.out.println("TESTE TEMP: ");
                                System.out.println(temperatura);
                            }
                            message = inFromServer.readLine();
                            if (message.equals("Umidade"))
                            {
                                umidade = inFromServer.readLine();
                            }if (message.equals("Temperatura"))
                            {
                                temperatura = inFromServer.readLine();
                            }
                            
                            person.setHumidity(Double.parseDouble(umidade));
                            person.setTemperature(Double.parseDouble(temperatura));
                            message = inFromServer.readLine();
                            if(message.equals("Conexao terminada!"))
                            {
                                break;
                            }
                        }
                        
                        
                        message = inFromServer.readLine();
                        if(message.equals("Conexao terminada!"))
                        {
                            break;
                        }
                        if(message.equals("Idade"))
                        {
                            idade = inFromServer.readLine();
                        }
                        if(message.equals("Altura"))
                        {
                            altura = inFromServer.readLine();
                        }
                        if(message.equals("Peso"))
                        {
                            peso = inFromServer.readLine();
                        }
                        if(message.equals("Sexo"))
                        {
                            sexo = inFromServer.readLine();
                        }
                        if(message.equals("Gordura"))
                        {
                            gordura = inFromServer.readLine();
                        }
                        if(message.equals("Hidratacao"))
                        {
                            hidratacao = inFromServer.readLine();
                        }
                        if (message.equals("Umidade"))
                        {
                            umidade = inFromServer.readLine();
                        }
                        if (message.equals("Temperatura"))
                        {
                            temperatura = inFromServer.readLine();
                        }
                        /*
                         * Checa se a conexão foi encerrada.
                         * Se a conexão nao foi terminada, mas o botao 1 foi pressionado, imprime e
                         * envia os dados para o banco.
                         */
                        if ((message.equals("Conexao terminada!")))
                        {
                            System.out.println("\nDados recebidos!");
                            System.out.println("\nUmidade: "+ umidade
                                 +"\nTemperatura: "+ temperatura
                                 +"\nIdade: " + idade
                                 +"\nAltura: " + altura
                                 +"\nPeso: " + peso
                                 +"\nSexo: " + sexo
                                 +"\nGordura: "+ gordura
                                 +"\nHidratação: " + hidratacao);
                            double temp = Double.parseDouble(temperatura);
                            temp = temp/100;
                            double umid = Double.parseDouble(umidade);
                            umid = umid/100;
                            person.setHumidity(umid);
                            person.setTemperature(temp);
                            person.setAge(Integer.parseInt(idade));
                            person.setHeight(Integer.parseInt(altura));
                            person.setWeight(Double.parseDouble(peso));
                            person.setSex(sexo);
                            person.setFat(Double.parseDouble(gordura));
                            person.setHydration(Double.parseDouble(hidratacao));
                            person.getImc();
                            person.setMeasure(1);
                            _person = person;
                         do
                         {
                             /*
                              * Tenta Inserir os dados no banco até conseguir.
                              */
                             ok = Sql.insert(idade, altura, peso, sexo, gordura, hidratacao, umidade, temperatura);
                         }while (ok==0);
                        }
                    }while (message!="Conexao terminada!");//quando a mensagem "Conexao terminada!" chega
                    // o aplicativo encerra a conexão com o servidor e com o banco de dados.
                     clientSocket.close();
                     try
                     {
                        Sql.connection.close();
                     }
                     catch(SQLException sqlException)
                     {
                         sqlException.printStackTrace();
                     }
                 
            } while(message.equals("Conexao terminada!")== false);
                
            } catch (UnknownHostException ex) {
                Logger.getLogger(EnergySensor.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            } catch (IOException ex) {
                Logger.getLogger(EnergySensor.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        }
        else
        {
        }        
        return person;
    }
}